home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / idif_10b / source / diffcomp.c < prev    next >
C/C++ Source or Header  |  1996-01-21  |  9KB  |  395 lines

  1. /*Includes standard*/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. /*D‚claration des fonctions*/
  7. void howto(void);
  8. int main(int,char **);
  9. int diff(char *,char *);
  10. int reduct(char *);
  11. int crcheck(char *);
  12. void umsg(char *,char *);
  13.  
  14. /*D‚claration des fonctions externes*/
  15. extern int crc16file(char *name);
  16.  
  17. /*Quelques constantes fort utiles*/
  18. #define OK 0
  19. #define ERROR (-1)
  20. #define FALSE 0
  21. #define TRUE 1
  22.  
  23. /*D‚claration des variables*/
  24. FILE *logf;
  25. char str[255];
  26. char str2[255];
  27. char domain[50];
  28. char misc[150];
  29. char nnod[255];
  30. int zone=0;
  31. int region=0;
  32. int net=0;
  33. int hub=0;
  34.  
  35. /*D‚claration des variables externes*/
  36. extern unsigned int fcrc;
  37.  
  38. /*Fonction principale*/
  39. int main(int argc,char **argv)
  40. {
  41.     int err;
  42.  
  43.     /*Affichage des infos*/
  44.     printf("InterDiff v1.00 Beta 1\n(c) 1995, Nicolas LONG\n");
  45.     printf("Ce logiciel est diffus‚ selon les termes de la license publique GNU.\n");
  46.     printf("Il est d‚di‚ aux utilisateurs d'IntermŠde BBS.\n");
  47.     printf("Merci … Philippe Orand pour son aide pr‚cieuse !\n---\n\n");
  48.  
  49.     logf=fopen("INTERDIF.LOG","a");
  50.     fprintf(logf,"---\n");
  51.  
  52.     /*Si il y a plus de 1 token dans la ligne de cmd*/
  53.     if(argc>1)
  54.     {
  55.         if(!strcmp(*(argv+1),"-diff") && *(argv+2)!=NULL && *(argv+3)!=NULL)
  56.         {
  57.             umsg("Commande","-diff");
  58.  
  59.             err=diff(*(argv+2),*(argv+3)); /*On applique le diff*/
  60.             fclose(logf);
  61.             return(err);
  62.         }
  63.  
  64.         if(!strcmp(*(argv+1),"-ver") && *(argv+2)!=NULL)
  65.         {
  66.             umsg("Commande","-ver");
  67.  
  68.             err=crcheck(*(argv+2)); /*On v‚rifie le CRC16*/
  69.             fclose(logf);
  70.             return(err);
  71.         }
  72.  
  73.         /*R‚duction de nodelist*/
  74.         if(!strcmp(*(argv+1),"-red") && *(argv+2)!=NULL)
  75.         {
  76.             umsg("Commande","-red");
  77.  
  78.             /*V‚rification des paramŠtres*/
  79.             if(!strcmp(*(argv+2),"-z") && *(argv+3)!=NULL)
  80.                 sscanf(*(argv+3),"%d",&zone);
  81.  
  82.             /*Si la zone est coh‚rente*/
  83.             if(zone>0 && *(argv+4)!=NULL)
  84.             {
  85.                 /*Si une r‚gion est sp‚cifi‚e*/
  86.                 if(!strcmp(*(argv+4),"-r") && *(argv+5)!=NULL)
  87.                     sscanf(*(argv+5),"%d",®ion);
  88.                 /*Sinon r‚duction en nodelist de zone*/
  89.                 else if(*(argv+4)[0]!='-')
  90.                 {
  91.                     err=reduct(*(argv+4));
  92.                     fclose(logf);
  93.                     return(err);
  94.                 }
  95.             }
  96.                 
  97.             if((region>0 || net>0) && *(argv+6)!=NULL)
  98.             {
  99.                 /*R‚duction en nodelist de r‚gion*/
  100.                 if(*(argv+6)[0]!='-')
  101.                 {
  102.                     err=reduct(*(argv+6));
  103.                     fclose(logf);
  104.                     return(err);
  105.                 }
  106.             }
  107.         }
  108.         /*Affiche le mode d'emploi en cas de mauvais format des paramŠtres*/
  109.         howto();
  110.         fclose(logf);
  111.         return(ERROR);
  112.     }
  113.     
  114.     /*Affichage du mode d'emploi*/
  115.     else
  116.     {
  117.         howto();
  118.         fclose(logf);
  119.         return(ERROR);
  120.     }
  121. }
  122.  
  123. int diff(char *dif,char *oldnod)
  124. {
  125.     /*D‚claration des variables locales*/
  126.     FILE *df;
  127.     FILE *of;
  128.     FILE *nf;
  129.     int i,j,cnt,ver;
  130.     char c;
  131.  
  132.     if((df=fopen(dif,"rb"))==NULL) /*Ouverture du fichier diff*/
  133.     {
  134.         umsg("Erreur … l'ouverture de la nodediff:",strerror(errno));
  135.         return ERROR;
  136.     }
  137.  
  138.     if((of=fopen(oldnod,"rb"))==NULL) /*Ouverture de la vieille nodelist*/
  139.     {
  140.         umsg("Erreur … l'ouverture de la nodelist :",strerror(errno));
  141.         return ERROR;
  142.     }
  143.  
  144.     strcpy(str,dif); /*Recherche du num‚ro de version du diff*/
  145.     for(i=strlen(str)-1;str[i]!='.' && i>=0;i--);
  146.     str[i+4]=0;
  147.     sscanf(&(str[i+1]),"%d",&ver);
  148.  
  149.     strcpy(str,oldnod); /*G‚n‚ration du chemin d'accŠs … la nouvelle nodelist*/
  150.     for(i=strlen(str)-1;str[i]!='.' && i>=0;i--);
  151.     str[i+1]=0;
  152.     sprintf(nnod,"%s%03d",str,ver);
  153.  
  154.     if((nf=fopen(nnod,"wb"))==NULL) /*Ouverture de la nouvelle nodelist*/
  155.     {
  156.         umsg("Erreur … l'ouverture de la nodelist:",strerror(errno));
  157.         return ERROR;
  158.     }
  159.     
  160.     fgets(str,255,df); /*Lecture des lignes de controle*/
  161.     fgets(str2,255,of);
  162.     fseek(of,0,SEEK_SET);
  163.  
  164.     if(strcmp(str,str2)) /*Controle*/
  165.     {
  166.         umsg("Nodediff et Nodelist ne se correspondent pas","");
  167.         return(ERROR);
  168.     }
  169.     
  170.     umsg("G‚n‚ration de la nodelist:",nnod);
  171.     printf("Veuillez patienter...\n");
  172.  
  173.     while(fgets(str,255,df)!=NULL)
  174.     {    
  175.         if(str[0]=='A') /*Ajout de lignes*/
  176.         {
  177.             sscanf(str+1,"%d",&cnt);
  178.             for(j=0;j<cnt;j++)
  179.             {
  180.                 fgets(str,255,df);
  181.                 fputs(str,nf);
  182.             }
  183.         }
  184.  
  185.         else if(str[0]=='D') /*Effacement de lignes*/
  186.         {
  187.             sscanf(str+1,"%d",&cnt);
  188.             for(j=0;j<cnt;j++)
  189.             {
  190.                 fgets(str,255,of);
  191.             }
  192.         }
  193.  
  194.         else if(str[0]=='C') /*Copie de lignes*/
  195.         {
  196.             sscanf(str+1,"%d",&cnt);
  197.             for(j=0;j<cnt;j++)
  198.             {
  199.                 fgets(str,255,of);
  200.                 fputs(str,nf);
  201.             }
  202.         }
  203.     }
  204.  
  205.     c=26;
  206.     fwrite(&c,1,1,nf);    
  207.  
  208.     fclose(of); /*Fermeture des fichiers*/
  209.     fclose(df);
  210.     fclose(nf);
  211.  
  212.     umsg("Nouvelle Nodelist g‚n‚r‚e avec succŠs","");
  213.     return OK;
  214. }
  215.  
  216. /*R‚duction de nodelist*/
  217. int reduct(char *nodel)
  218. {
  219.     /*D‚claration des variables locales*/
  220.     FILE *nf;
  221.     FILE *rf;
  222.     char *cpt;
  223.     char *cpt2;
  224.     char *ex;
  225.     char c;
  226.     int i,ver;
  227.     int fpos,fpos2;
  228.  
  229.     if((nf=fopen(nodel,"rb"))==NULL) /*Ouverture de la nodelist*/
  230.     {
  231.         umsg("Erreur … l'ouverture de la nodelist:",strerror(errno));
  232.         return ERROR;
  233.     }
  234.  
  235.     strcpy(str,nodel); /*Recherche du num‚ro de version*/
  236.     for(i=strlen(str)-1;str[i]!='.' && i>=0;i--);
  237.     str[i+4]=0;
  238.     sscanf(&(str[i+1]),"%d",&ver);
  239.  
  240.     /*G‚n‚ration du nom de la nodelist r‚duite*/
  241.     strcpy(str,nodel);
  242.     for(i=strlen(str)-1;str[i]!='\\' && str[i]!='/' && i>=0;i--)
  243.         str[i]=0;
  244.     sprintf(nnod,"%s%s_%d.%03d",str,region ? "reg" : "zone",region ? region : zone);
  245.     umsg("G‚n‚ration de la nodelist r‚duite",nnod);
  246.  
  247.     if((rf=fopen(nnod,"wb"))==NULL) /*Ouverture de la nouvelle nodelist*/
  248.     {
  249.         umsg("Erreur … l'ouverture de la nodelist:",strerror(errno));
  250.         return ERROR;
  251.     }
  252.  
  253.     /*Analyse de la premiŠre ligne de la nodelist*/
  254.     fscanf(nf,";A %s Nodelist",domain); /*Nom du r‚seau*/
  255.     umsg("R‚seau:",domain);
  256.  
  257.     /*G‚n‚ration de la nouvelle ligne d'en-tˆte*/
  258.     sprintf(domain,"%s_%s_%d",domain,region ? "Region" : "Zone",region ? region : zone); 
  259.     fgets(str,255,nf);
  260.     cpt=strtok(str,":");
  261.     sprintf(str2,";A %s Nodelist%s: %u\xD\xA",domain,cpt,12345U);
  262.     fputs(str2,rf); /*Ecriture*/
  263.  
  264.     /*Signature du logiciel*/
  265.     fprintf(rf,";A Reduced Nodelist generated by InterDiff v1.00\xD\xA");
  266.     fprintf(rf,";A (c) 1995, by Nicolas Long at IntermŠde BBS, 2:323/13.16\xD\xA;\xD\xA",rf);
  267.  
  268.     /*Recherche de la zone … traiter dans la nodelist*/
  269.     do
  270.     {
  271.         do
  272.         {
  273.             ex=fgets(str,255,nf);
  274.         }while(str[0]==';' && ex!=0); /*On saute les commentaires*/
  275.         cpt=strtok(str,",");
  276.     }while(strcmp(cpt,"Zone") || atoi(strtok(NULL,","))!=zone);
  277.  
  278.     str[strlen(str)]=',';
  279.  
  280.     /*Ecriture des nodes ind‚pendants de la zone (jusqu'… la premiŠre r‚gion)*/
  281.     do
  282.     {
  283.         if(str[0]!=';')
  284.             str[strlen(str)]=',';
  285.         fputs(str,rf);
  286.         do
  287.         {
  288.             ex=fgets(str,255,nf);
  289.         }while(str[0]==';' && str[1]>16 && ex!=0);
  290.         cpt=strtok(str,",");
  291.     }while(strcmp(cpt,"Region") && ex!=0);
  292.  
  293.     /*Si on fait une nodelist de r‚gion*/
  294.     if(region>0)
  295.     {
  296.         /*Recherche de la r‚gion*/
  297.         do
  298.         {
  299.             do
  300.             {
  301.                 ex=fgets(str,255,nf);
  302.             }while(str[0]==';' && ex!=0);
  303.             cpt=strtok(str,",");
  304.         }while(strcmp(cpt,"Region") || atoi(strtok(NULL,","))!=region);
  305.  
  306.         str[strlen(str)]=',';
  307.  
  308.         /*Ecriture des nodes de la region*/
  309.         do
  310.         {
  311.             if(str[0]!=';')
  312.                 str[strlen(str)]=',';
  313.             fputs(str,rf);
  314.             do
  315.             {
  316.                 ex=fgets(str,255,nf);
  317.             }while(str[0]==';' && str[1]>16 && ex!=0);
  318.             cpt=strtok(str,",");
  319.         }while(strcmp(cpt,"Region") && strcmp(cpt,"Zone") && ex!=0);
  320.     }
  321.  
  322.     /*Si on fait une nodelist de zone*/
  323.     else
  324.     {
  325.         /*Ecriture des nodes de la zone*/
  326.         do
  327.         {
  328.             if(str[0]!=';')
  329.                 str[strlen(str)]=',';
  330.             fputs(str,rf);
  331.             do
  332.             {
  333.                 ex=fgets(str,255,nf);
  334.             }while(str[0]==';' && str[1]>16 && ex!=0);
  335.             cpt=strtok(str,",");
  336.         }while(strcmp(cpt,"Zone") && ex!=0);
  337.     }
  338.  
  339.     c=26; /*On ajoute le EOF*/
  340.     fwrite(&c,1,1,rf);    
  341.  
  342.     fclose(nf); /*Fermeture des fichiers*/
  343.     fclose(rf);
  344.  
  345.     crc16file(nnod); /*Calcul du CRC16*/
  346.  
  347.     /*On ‚crit aprŠs coup le CRC dans l'en-tˆte. Pas trŠs ‚l‚gant mais bon...*/
  348.     rf=fopen(nnod,"ab");
  349.     fseek(rf,SEEK_SET,0);
  350.     sprintf(&(str2[strlen(str2)-7]),"%05u\xD\xA",fcrc);
  351.     fputs(str2,rf);
  352.     fclose(rf);
  353.  
  354.     umsg("Nodelist r‚duite g‚n‚r‚e avec succŠs","");
  355.     return(OK);
  356. }
  357.  
  358. /*V‚rif du CRC16*/
  359. int crcheck(char *fname)
  360. {
  361.     FILE *nf;
  362.     unsigned int crc;
  363.  
  364.     umsg("V‚rification du fichier",fname);
  365.  
  366.     if((nf=fopen(fname,"rb"))==NULL) /*Ouverture de la nodelist*/
  367.     {
  368.         umsg("Erreur … l'ouverture de la nodelist:",strerror(errno));
  369.         return ERROR;
  370.     }
  371.  
  372.     fgets(str,255,nf); /*Lecture de la premiŠre ligne*/
  373.     fclose(nf);
  374.     crc=atoi(&(str[strlen(str)-7])); /*Recherche du CRC dans la chaine lue*/
  375.  
  376.     crc16file(fname); /*Calcul du CRC*/
  377.  
  378.     /*Comparaison des CRC*/
  379.     umsg(crc==fcrc ? "Test CRC Ok" : "Mauvais CRC","");
  380.  
  381.     return(OK);
  382. }
  383.  
  384. void howto(void)
  385. {
  386.         umsg("Mauvais format des paramŠtres !","(voir INTERDIF.DOC)");
  387. }
  388.  
  389. /*Affichage de messages*/
  390. void umsg(char *msgh,char *msgt)
  391. {
  392.     printf("%s %s\n",msgh,msgt);
  393.     fprintf(logf,"%s %s\n",msgh,msgt);
  394. }
  395.